funkcia swap
Otázka od: Peter Surovy
19. 9. 2002 13:53
Ahoj
mam DelphiV Ent a tam je funkcia
swap ktora prevadza high-order bytes value
na low-order-bytes value.
ale funguje len pre 16 bitove hodnoty
ja by som potreboval pre 32 bitove konkr
longword.
Existuje to niekde alebo si to treba napisat?
Dik
Peter
Odpovedá: Jiří Semler
19. 9. 2002 17:17
> swap ktora prevadza high-order bytes value
> na low-order-bytes value.
> ale funguje len pre 16 bitove hodnoty
> ja by som potreboval pre 32 bitove konkr
> longword.
Asi nejak takle:
function Swap32(x:longword):longword;
var y:array [1..4] of byte absolute x;
z:byte;
begin
z:=y[1]; y[1]:=y[4]; y[4]:=z;
z:=y[3]; y[3]:=y[2]; y[2]:=z;
result:=x;
end;
Odpovedá: Petr Fejfar
19. 9. 2002 16:50
From: "Jiří Semler" <jsemler@stbk.mcs.cz>
> function Swap32(x:longword):longword;
> var y:array [1..4] of byte absolute x;
> z:byte;
> begin
> z:=y[1]; y[1]:=y[4]; y[4]:=z;
> z:=y[3]; y[3]:=y[2]; y[2]:=z;
> result:=x;
> end;
Pokud tomu dobre rozumim, tak Ti jde o otoceni Endianu.
To by slo treba takhle:
function ReverseEndian(aValue:dword): dword; assembler;
asm
xchg al,ah
rol eax,16
xchg al,ah
end;
HTH, pf
Odpovedá: Peter Surovy
19. 9. 2002 18:24
Ahoj
----- Original Message -----
From: "Petr Fejfar" <development@callnet.cz>
Sent: Thursday, September 19, 2002 4:49 PM
> Pokud tomu dobre rozumim, tak Ti jde o otoceni Endianu.
-- presne
> To by slo treba takhle:
--no ja som to medzi casom spravil
podobne ako radil:
----- Original Message -----
From: "Jiří Semler" <jsemler@stbk.mcs.cz>
Sent: Thursday, September 19, 2002 3:43 PM
> function Swap32(x:longword):longword;
> var y:array [1..4] of byte absolute x;
> z:byte;
----ale toto Tvoje sa mi zda tiez zaujimave
hlavne preto ze z toho nerozumiem nic
okrem 'function' a 'end' jake to ma vyhody?
> function ReverseEndian(aValue:dword): dword; assembler;
> asm
> xchg al,ah
> rol eax,16
> xchg al,ah
> end;
Peter
Odpovedá: Petr Fejfar
19. 9. 2002 19:23
From: "Peter Surovy" <psurovy@uevora.pt>
> ----ale toto Tvoje sa mi zda tiez zaujimave
> hlavne preto ze z toho nerozumiem nic
> okrem 'function' a 'end' jake to ma vyhody?
>
> > xchg al,ah
> > rol eax,16
> > xchg al,ah
Vyhoda bude v jednoduchosti a rychlosti, protoze pokud jsem ten assembler
moc nezapomel, tak to asi implementovat rychleji nejde.
A endiany se vetsinou prohazuji pri komunikaci
Unix <-> WinTel, takze tam o rychlost zpravidla jde.
Pouziva to registrovou volaci konvenci, takze vstup je v registru EAX,
vysledek taky.
Instrukce XCHG prohazuji byty ve spodnim slove, ROL prohodi slova rotaci
doleva o 16 bitu. Tot vse.
HTH, pf